/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.com.cotelasa.scp.dao.impl;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import pe.com.cotelasa.common.dao.DaoImpl;
import pe.com.cotelasa.common.dao.excepcion.DAOException;
import pe.com.cotelasa.scp.dao.IDAOCajaChica;
import pe.com.cotelasa.scp.dao.IDAOMovimientoCajaChica;
import pe.com.cotelasa.scp.dominio.common.ESTADO_REGISTRO;
import pe.com.cotelasa.scp.dominio.common.ResultadoServicio;
import pe.com.cotelasa.scp.entidad.Banco;
import pe.com.cotelasa.scp.entidad.CajaChica;
import pe.com.cotelasa.scp.entidad.Contacto;
import pe.com.cotelasa.scp.entidad.DocumentoSustentador;
import pe.com.cotelasa.scp.entidad.MovimientoCajaChica;

/**
 *
 * @author Kield
 */
@Repository("daoCajaChica")
public class DAOCajaChicaImpl extends DaoImpl<CajaChica, Integer> implements IDAOCajaChica, Serializable {

    @Override
    @Transactional
    public Collection<CajaChica> listarCajasChicasTodos() throws DAOException {

        try {
            List list = sessionFactory.getCurrentSession().
                    createSQLQuery("select * from cotelasa.caja_chica").list();

            return list;
        } catch (Exception e) {
            throw new DAOException(e.getMessage(), e);
        }

    }

    @Override
    public Collection<CajaChica> listarCajaChicaPorFiltro(CajaChica cajaChica, Date fechaInicio, Date fechaFinal) throws DAOException {

        List<CajaChica> listaCajasChicas = new ArrayList<CajaChica>();
        try {

            sessionFactory.getCurrentSession().flush();
            Criteria query = sessionFactory.getCurrentSession().createCriteria(CajaChica.class)
                    .addOrder(Order.desc("id"))
                    .createAlias("idSede", "se")
                    .add(Restrictions.eq("estadoRegistro", ESTADO_REGISTRO.ACTIVO.getValor()))
                    .add(Restrictions.like("estadoCaja", "%" + cajaChica.getEstadoCaja() + "%"))
                    .add(Restrictions.like("nombre", "%" + cajaChica.getNombre() + "%"))
                    .add(Restrictions.like("numeroDocumento", "%" + cajaChica.getNumeroDocumento() + "%"));

            if (cajaChica.getIdSede().getId() != 0) {
                query = query.add(Restrictions.eq("idSede", cajaChica.getIdSede()));
            } else {
                query = query.add(Restrictions.eq("se.idEmpresa", cajaChica.getIdSede().getIdEmpresa()));
            }

            if (fechaInicio == null && fechaFinal == null) {
                listaCajasChicas = query.list();
            } else if (fechaInicio != null && fechaFinal != null) {
                listaCajasChicas = query.add(Restrictions.ge("fechaApertura", fechaInicio)).add(Restrictions.le("fechaApertura", fechaFinal)).list();
            } else if (fechaInicio == null) {
                listaCajasChicas = query.add(Restrictions.le("fechaApertura", fechaFinal)).list();
            } else if (fechaFinal == null) {
                listaCajasChicas = query.add(Restrictions.ge("fechaApertura", fechaInicio)).list();
            }
        } catch (Exception e) {
            e.printStackTrace();
            throw new DAOException(e.getMessage(), e);
        }

        return listaCajasChicas;

    }

    @Override
    public Collection<CajaChica> listarCajasChicasBusqueda(CajaChica cajaChica) throws DAOException {

        List<CajaChica> listaCajas = new ArrayList<CajaChica>();
        try {
            sessionFactory.getCurrentSession().flush();
            listaCajas = sessionFactory.getCurrentSession().createCriteria(CajaChica.class)
                    .add(Restrictions.eq("estadoRegistro", ESTADO_REGISTRO.ACTIVO.getValor()))
                    .add(Restrictions.eq("estadoCaja", cajaChica.getEstadoCaja()))
                    .add(Restrictions.eq("codigoCaja", cajaChica.getCodigoCaja()))
                    .add(Restrictions.eq("idSede", cajaChica.getIdSede()))
                    .list();

            //.add(Restrictions.eq("idMovimientoCuentaBancaria", cajaChica.getIdMovimientoCuentaBancaria()))
        } catch (Exception e) {
            throw new DAOException(e.getMessage(), e);
        }
        return listaCajas;

    }

    @Override
    public Collection<CajaChica> listarCajaCerradaPorSedeConSaldo(CajaChica cajaChica) throws DAOException {
        List<CajaChica> listaCajas = new ArrayList<CajaChica>();
        try {
            sessionFactory.getCurrentSession().flush();
            listaCajas = sessionFactory.getCurrentSession().createCriteria(CajaChica.class)
                    .add(Restrictions.eq("estadoRegistro", ESTADO_REGISTRO.ACTIVO.getValor()))
                    .add(Restrictions.eq("estadoCaja", CajaChica.ESTADO_CAJA_CHICA.CERRADA.getValor()))
                    .add(Restrictions.eq("idSede", cajaChica.getIdSede()))
                    .add(Restrictions.gt("saldoCaja", BigDecimal.ZERO))
                    .list();

            //.add(Restrictions.eq("idMovimientoCuentaBancaria", cajaChica.getIdMovimientoCuentaBancaria()))
        } catch (Exception e) {
            throw new DAOException(e.getMessage(), e);
        }
        return listaCajas;
    }
}
